perm filename ACMPAP.L70[L70,TES] blob
sn#009944 filedate 1972-06-27 generic text, type T, neo UTF8
00100 .PAGE FRAME 54 HIGH 80 WIDE
00200 .COUNT PAGE FROM 0
00300 .PORTION TITLEPAGE
00400 .BEGIN
00500 .CENTER
00600 .SKIP TO LINE 20
00700 THE PROGRAMMING LANGUAGE "LISP70"
00800
00900 LAWRENCE G. TESLER, HORACE J. ENEA, AND DAVID C. SMITH
01000
01100 STANFORD UNIVERSITY
01200 ARTIFICIAL INTELLIGENCE PROJECT
01300
01400 FEBRUARY, 1972
01500 .END
01600 .PORTION REPORT
01700 .INDENT 5,0
01800 .MACRO BC ⊂ BEGIN GROUP CENTER SKIP 1 ; ⊃
01900 .MACRO ec ⊂ SKIP 1 ; END CONTINUE ⊃
02000 .MACRO e ⊂ SKIP 1 ; END ⊃
02100 .TURN ON "↓_[]#α∂"
02200 .MACRO s(N) ⊂ SNAME←DATE ; NEXT PAGE ONCE CENTER ; "N" ;
02300 . SKIP 2 ; SNAME ← "N" ⊃ ;
02400 .EVERY HEADING(LISP70,,{SNAME})
02500 .EVERY FOOTING(,{PAGE},)
00100 .S INTRODUCTION
00200 The language LISP [ref McCarthy] deals with recursive functions of symbolic
00300 expressions. There has recently emerged a trend towards creating
00400 "New LISPs" offering additional capabilities. Of primary interest are
00500 expanded control structures, including backtracking and multiple
00600 processing. Also of importance are varied methods of data access,
00700 such as associative data bases. The question of an appropriate successor
00800 to LISP is discussed elsewhere [ref Bobrow].
00900
01000 Some of the "New LISPs" that are currently under development are PLANNER
01100 at MIT [ref Hewitt], QA-4 at SRI [ref Rulifson], POP-2 at ?? [ref ??],
01200 and LISP70, the subject of the present paper. Having
01300 evolved separately, they differ somewhat in detail. However, their
01400 similarities are more striking than their differences. All provide
01500 convenient vehicles for theorem proving, robot planning, natural
01600 language processing, and other complex problem solving tasks.
01700
01800 LISP70 is distinguished from the other "New LISPs" primarily by its
01900 extendability. The design goals of the language, in approximate order
02000 of importance, are:
02100 .bc
02200 (1) Extendability #
02300 (2) Inter-machine transferability
02400 (3) Facilitated debugging #
02500 (4) Convenient input and output #
02600 (5) Efficiency of operation #
02700 .ec
02800 Each of these goals will be discussed separately.
00100 .S EXTENDABILITY
00200 Every extendable language consists of a "core" and a method of extending
00300 that core. The core of LISP70 is actually much larger than necessary;
00400 that is, most parts of the core are defined in terms of more primitive
00500 parts. Some of the facilities offered are:
00600 .bc
00700 (1) LISP 1.5, a common standard [ref] #
00800 (2) MLISP, an Algol-like M-expression notation [ref Enea, ref Smith] #
00900 (3) Automatic Backtracking [ref Floyd] #
01000 (4) Pattern-Directed Computation #
01100 (5) Syntax-Directed Input-Output #
01200 (6) Extensive monitoring capabilities #
01300 (7) A variety of data types #
01400 (8) "Extendable Functions" #
01500 .e
01600 An Extendable Function is a function which is defined by an open-ended
01700 set of "rewrite rules" [ref somebody].
01800 The "EXTEND Statement" adds new rules to an Extendable Function.
01900 The LISP70 compilers are defined primarily in terms of Extendable Functions.
02000 Thus, anyone can extend them by use of appropriate EXTEND Statements. The
02100 scope of an extension can be a whole program or any part of a program.
00100 .S EXTENDING MLISP
00200 MLISP is defined entirely by Extendable Functions such as "EXPRESSION",
00300 which translates an M-expression to an S-expression. For example, the
00400 conditional expression of MLISP is defined in terms of the conditional
00500 expression of LISP by the following rewrite rule in EXPRESSION:
00600 .bc
00700 ⊂IF <expression>:e1 THEN <expression>:e2 ELSE <expression>:e3⊃ #
00800 →→ (COND (:e1 :e2) (T :e3)) #
00900 .ec
01000 Every rewrite rule has a left side and a right side separated by right-pointing
01100 arrows. A rewrite rule can translate any input that matches its left
01200 side to an output constructed by its right side. Strictly local variables
01300 (preceded by the character ":") serve to carry information from the left
01400 side to the right side.
01500
01600 The above rule for translating conditionals is read from left to right
01700 as follows:
01800 .begin narrow 10,10
01900 An input stream ("⊂...⊃") which begins with the symbol `IF', followed
02000 by an <expression> (whose translation is bound to e1), followed by
02100 `THEN', followed by another <expression> (whose translation is
02200 bound to e2), followed by `ELSE', followed by another <expression>
02300 (whose translation is bound to e3), can definitely ("→→") be rewritten
02400 as a list of the following three elements: first, the symbol `COND';
02500 second, a list containing the binding of e1 and the binding of e2;
02600 finally, a list containing `T' and the binding of e3.
02700 .end skip
02800 Each of the three occurrences of <expression> within this definition calls
02900 EXPRESSION recursively to translate portions of the conditional. Should
03000 any of these calls fail, the entire rewrite rule fails and a different
03100 rule of EXPRESSION is tried. Thus, more than one rule of the syntax may
03200 begin with the symbol `IF'. In fact, it is possible to define arbitrarily
03300 context-sensitive grammars with LISP70 rewrite rules, but this subject will
03400 not be explored here.
03500
03600 As an illustration of the operation of the above rewrite rule, the
03700 processing of the following input stream will be traced:
03800 .bc
03900 if a=b then 7 else cons(7,a)
04000 .ec
04100 After `IF' is matched, `a=b' is translated by a recursive call on EXPRESSION to
04200 `(EQUAL A B)', which is bound to e1. The other local variables are bound
04300 in a similar manner, yielding:
04400 .bc
04500 e1 = (EQUAL A B)#
04600 e2 = 7 #
04700 e3 = (CONS 7 A) #
04800 .ec
04900 These bindings are substituted into the right hand side, outputting the
05000 translation:
05100 .bc
05200 (COND ((EQUAL A B) 7) (T (CONS 7 A)) )
05300 .e
05400 Example:
05500 .bc
05600 extendable function simplify = #
05700 (PLUS 0 ::X) →→ (PLUS ::X)*, #
05800 (PLUS :A ::B) →→ (PLUS :A (PLUS ::B)*@@CDR), #
05900 (PLUS) →→ 0 ; #
06000 .e
06100 Some notation must be explained:
06200 .bc
06300 :X Matches any one item and binds it to X. #
06400 :X On right side: the binding of X. #
06500 ::X Matches zero or more items, forms them into #
06600 a list, binds that list to X. #
06700 ::X On right side: the elements of X, i.e., the list#
06800 X with its outer parentheses stripped. #
06900 @F Postfix Function Call: Call function F with the#
07000 preceding value as its argument, e.g., #
07100 ((A) B C)@CAR yields (A). #
07200 @@F Call F and strip the result, e.g., #
07300 ((A) B C)@@CAR yields A. #
07400 * Call the current function recursively, i.e., #
07500 same as @SIMPLIFY. #
07600 ** In this case, same as @@SIMPLIFY. #
07700 (...) Match or construct a list. #
07800 ⊂...⊃ Match or construct a stream. #
07900 `...' Same as ⊂...⊃, but no special characters are #
08000 recognized except <>*@: #
08100 .e
08200 Let us trace the call (SIMPLIFY (QUOTE (PLUS HAT 0 J K))).
08300 .bc
08400 Argument Rule Applied Result
08500 -------- ---- ------- ------
08600
08700 (PLUS HAT 0 J K)) 2 (PLUS HAT (PLUS 0 J K)*@@CDR) #
08800 (PLUS 0 J K) 1 (PLUS J K)* #
08900 (PLUS J K) 2 (PLUS J (PLUS K)*@@CDR) #
09000 (PLUS K) 2 (PLUS K (PLUS)*@@CDR) #
09100 (PLUS) 3 (PLUS) #
09200
09300 Expression After * After CDR After STRIP
09400 ---------- ------- --------- -----------
09500
09600 (PLUS)*@@CDR (PLUS)@@CDR ()@STRIP ⊂ ⊃ #
09700 (PLUS K)*@@CDR (PLUS K)@@CDR (K)@@STRIP K #
09800 (PLUS 0 J K)*@@CDR (PLUS J K)@@CDR (J K)@STRIP J K #
09900 .ec
10000 When several rules occur in an extendable function, they are ordered Most
10100 Specific First. If the left side of the first rule matches the input,
10200 then the value of the function is computed by the right side of that rule.
10300 Otherwise, subsequent rules are tried in the same way. If no rule matches,
10400 a failure occurs, causing backtracking.
10500
10600 Proper ordering of rules is important both for speed and correctness.
10700 In the compiler, the Most Specific First heuristic is trivial to
10800 implement. For example, if the left sides of two rules are identical
10900 up to a point at which one has a literal symbol and the other has a
11000 local variable binding, then the former rule is ordered before the
11100 latter. This is because the literal symbol can only match one possible
11200 input entity while the local variable binding can match anything.